home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_400
/
422_02
/
dosutil
/
chainsaw.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-20
|
4KB
|
154 lines
/*
* CHAINSAW.... Chop down an entire directory tree.
*
* This program will remove an entire directory tree or portion thereof
* (outward from any branch), including all sub-directories...
* USE WITH EXTREME CAUTION!!! Careless use of this program could result
* in the loss of LARGE amounts of data.
*
* To minimize the chances of disaster, the program does error checking
* on every critical operation, and aborts if a failure occures. If this
* happens fix the problem, and run CHAINSAW again.
*
* Copyright 1992-1994 Dave Dunfield
* All rights reserved.
*
* Permission granted to use for personal (non-commercial) use only.
*
* Compile command: cc chainsaw -fop
*/
#include <stdio.h>
#include <file.h>
#define MAXDIRS 500 /* Maximum number of directories to stack */
/* Stack of directory names... + top of stack marker */
char names[MAXDIRS][13];
unsigned ndir = 0, fcount = 0, dcount = 0, rc;
/* Command line switches */
char message = -1, yesno = -1, system = 0;
/* File control block for delete file function */
char fcb[37] = { "\000???????????" };
/* Register holders for int86() function */
extern int _AX_, _DX_;
/*
* Main program... parse arguments, ask permission, and KILL! KILL! KILL!
*/
main(argc, argv)
int argc;
char *argv[];
{
int i;
char buffer[25], directory[68], old_dir[68], *ptr, flag;
/* Record our current position */
old_dir[0] = get_drive() + 'A';
old_dir[1] = ':';
old_dir[2] = '\\';
getdir(&old_dir[3]);
/* If argument is passed, parse directory */
for(flag=i=1; i < argc; ++i) {
ptr = argv[i];
switch((toupper(*ptr) << 8) | toupper(*(ptr+1))) {
case '/Q' :
case '-Q' :
message = 0;
break;
case '/Y' :
case '-Y' :
yesno = 0;
break;
case '/S' :
case '-S' :
system = -1;
break;
default:
if(flag) {
if(*((ptr = argv[1])+1) == ':') {
set_drive(toupper(*ptr) - 'A');
ptr += 2; }
if(cd(ptr))
abort("Unable to access directory");
break; }
case '/?' :
case '?' << 8 :
abort("Use: CHAINSAW [directory] [/Quiet /System /Yes]"); } }
if(message)
printf("CHAINSAW by Dave Dunfield\n");
/* Prompt with selected directory, and make sure he really wants to do it */
directory[0] = get_drive() + 'A';
directory[1] = ':';
directory[2] = '\\';
getdir(&directory[3]);
if(yesno) {
printf("Delete tree below %s (ARE YOU SURE)?", directory);
fgets(buffer, sizeof(buffer)-1, stdin); }
/* If he really wants to.... kill off everything */
if((!yesno) || (toupper(*buffer) == 'Y')) {
kill_tree(); /* Kill files & subdirs */
if(!cd("..")) /* Up to parent */
dcount += !rmdir(directory); } /* Kill base directory */
/* Try and restore our former directory position */
set_drive(old_dir[0] - 'A');
cd(old_dir);
if(message)
printf("\nRemoved %u files and %u directories.\n", fcount, dcount);
}
/*
* Kill all files in current directory, and then recursively call
* self to exterminate any sub-directories.
*/
kill_tree()
{
int j, attr, n;
char name[65];
/* If no files or sub-directories... do nothing */
if(find_first("*.*", HIDDEN|SYSTEM|DIRECTORY, name, &j, &j, &attr, &j, &j))
return;
/* Search and record sub-directories, insure all files delete-able */
n = ndir;
do {
if(attr & DIRECTORY) {
if(strcmp(name,".") && strcmp(name,".."))
strcpy(names[ndir++], name); }
else {
if((attr & (SYSTEM|READONLY)) && system) {
if(rc = set_attr(name, 0)) {
printf("Can't set attributes of file: %s (%d)\n", name, rc);
exit(-1); } }
++fcount; } }
while(!find_next(name, &j, &j, &attr, &j, &j));
/* Using FCB's, delete all files in this directory */
_AX_ = 0x1300;
_DX_ = fcb;
int86(0x21);
/* Kill off sub-directories */
while(ndir > n) {
if(rc = cd(names[ndir-1])) {
printf("Can't enter subdirectory: %s (%d)\n", names[ndir-1], rc);
exit(-1); }
kill_tree();
if(rc = cd("..")) {
printf("Can't access next higher directory. (%d)\n", rc);
exit(-1); }
if(rc = rmdir(names[--ndir])) {
printf("Can't remove subdirectory: %s (%d)\n", names[ndir], rc);
exit(-1); }
++dcount; }
}